// Mesh.h
// 定义了一个网格类，用于表示和操作模拟中的网格结构

#ifndef MESH
#define MESH
#include <iostream>        // 用于标准输入输出操作
#include <Eigen/Dense>     // Eigen库用于线性代数运算
#include "Param.h"         // 包含全局常量，如epsZero或Big

// 网格类定义
class Mesh
{
private:
    // 私有成员变量，表示网格的属性
    double  Length_;        // 网格的总长度
    double  SpaceStep_;     // 网格空间步长（当前仅支持单一空间步长）
    int     Ncells_;        // 物理单元格的数量
    int     NcellExt_;      // 包含虚拟（边界）单元格的总单元格数量
    int     Nfaces_;        // 网格面的数量
    int     LeftBCface_;    // 左边界面的ID
    int     RightBCface_;   // 右边界面的ID

public:
    // 动态矩阵，每行存储单元格i的坐标（x_cell, y_cell, z_cell）
    Eigen::MatrixXd CellCoordsTab_; 

    // 动态矩阵，每行存储面的ID，左侧单元格邻居的行ID（在CellCoordsTab_中），
    // 右侧单元格邻居的行ID（在CellCoordsTab_中）和面的x坐标
    Eigen::MatrixXd FaceIndex_;    
    Eigen::MatrixXd FaceIndexDual_;    // 双网格面的索引信息
    
    // 动态矩阵，每行存储单元格的索引信息，包括左侧面的ID，右侧面的ID，
    // 对于左侧虚拟单元格，左侧面的ID不存在，因此使用'NoIndex'值。
    // 右侧虚拟单元格同理
    Eigen::MatrixXd CellIndex_;       
    
    // 构造函数，使用给定的长度、单元格数量和虚拟单元格数量初始化网格
    Mesh(double Length, int Ncells, int NGhostcells); 

    // 公共方法，用于获取网格的属性
    double Get_Length();            // 获取网格的总长度
    double Get_SpaceStep();         // 获取网格空间步长
    int    Get_Ncells();            // 获取物理单元格的数量
    int    Get_NcellExt();          // 获取包括虚拟单元格在内的总单元格数量
    int    Get_Nfaces();            // 获取网格面的数量
    int    Get_LeftBCface();        // 获取左侧边界面的ID
    int    Get_RightBCface();       // 获取右侧边界面的ID

    // 返回面的左侧邻居单元格ID，参数为面的ID
    int   Get_Left_Neighbor(int face_id); 
    // 返回面的右侧邻居单元格ID，参数为面的ID
    int   Get_Right_Neighbor(int face_id);
                                
    // 根据单元格ID返回在CellCoordsTab_中的行号
    int   Get_CoordsTab(int cell_id);

};

#endif

